/********************************************
 *      链队列
 * Created by zlj on 2024/6/27.
********************************************/
#include "LinkQueue.h"

/**
 * 出始化
 * @param q
 */
void InitLinkQueue(LinkQueue *q)
{
    QueueNode *s = LINK_QUEUE_LEN;
    assert(q != NULL);
    q->front = q->tail = s;
    q->tail->next = NULL;
}

/**
 * 入队 在队尾执行插入
 * @param q
 * @param x
 */
void EnLinkQueue(LinkQueue *q, ElemType x)
{
    QueueNode *s = LINK_QUEUE_LEN;
    assert(s != NULL);
    s->data = x;
    s->next = NULL;
    q->tail->next = s;
    q->tail = s;
}

/**
 * 出队，在队头操作
 * @param q
 */
void DeLinkQueue(LinkQueue *q)
{
    if (q->front == q->tail)
        return;
    //获取队头的第一个有效结点
    QueueNode *p = q->front->next;
    q->front->next = p->next;
    free(p);
    if (p == q->tail)
        q->tail = q->front;
}

/**
 * 打印信息
 * @param q
 */
void LinkQueue_Show(LinkQueue *q)
{
    QueueNode *p = q->front->next;
    printf("Front:>");
    while (p != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
    }

    printf("<:Tail. \n");
}

/**
 * 获取头节点
 * @param q
 * @param v
 */
void LinkQueue_GetHead(LinkQueue *q, ElemType *v)
{
    if (q->front == q->tail)
        return;
    QueueNode *p = q->front->next;
    *v = p->data;
}

/**
 * 求长度
 * @param q
 * @return
 */
int LinkQueue_Length(LinkQueue *q)
{
    int len = 0;
    QueueNode *p = q->front->next;
    while (p != NULL)
    {
        len++;
        p = p->next;
    }
    return len;
}

/**
 * 清空
 * @param q
 */
void LinkQueue_Clear(LinkQueue *q)
{
    if (q->front == q->tail)
        return;
    QueueNode *p = q->front->next;
    while (p != NULL)
    {
        q->front->next = p->next;
        free(p);
        p = q->front->next;
    }
    q->tail = q->front;
}

/**
 * 销毁
 * @param q
 */
void LinkQueue_Destory(LinkQueue *q)
{
    LinkQueue_Clear(q);
    free(q->front);
    q->front = q->tail = NULL;
}